由於 LookupType 5 算是 LookupType 6 的子集功能,因此這裡一起講解。Contextual substitution 可以說是最複雜的替換類別。
對於像是 calt 這類只在符合特定前後文時進行取代的 feature,我們必須枚舉所有的可能性,並在要「被取代」的字符後方加上 '
符號,讓 OpenType 知道該字符是要被替換的對象。舉例來説,以上次我們提到的 gj
字符對,便需要枚舉,並且指定後面的 j 進行替換:
feature calt {
sub g j' by j.alt; # 出現 gj 時,將後面 j 顯示成 j.alt 字符
} clat;
而被取代的字也可以不只一個,例如將 etc
替換成 &c
:
feature calt {
sub e' t' c by ampersand; # etc 連續出現時,將 et 取代成 ampersand 字符
} calt;
上下文取代的語法可以組合成相當複雜的樣子,還可以配合 ignore ,針對某些特例的上下文,選擇性的忽視某些通則。
以上次提到的將錯字「尋(uni5C0B
)問(uni554F
)」轉成「詢(uni8A62
)問」來說,我們先寫出規則,指定當「尋問
」二字連續出現時,將前面的 尋
替換成 詢
,但同時,我們又必須避開「千尋問
鍋爐爺爺...」這樣的規則,因此我們再次枚舉出「千(uni5343
)尋(uni5C0B
)問(uni554F
)」這樣的省略規則:
feature calt {
ignore substitute uni5343 uni5C0B' uni554F;
substitute uni5C0B' uni554F by uni8A62;
} calt;
如此一來,尋問
二字就會替換成 詢問
,但如果前面出現 千
字時,feature 就會省略掉這串字符,讓文字保持著原本的樣子。
當使用的規則可能會超過 64K 時,可以加上 useExtension
字樣進行擴充。
feature aalt useExtension {
feature salt;
feature smcp;
substitute d by d.alt;
# ... other rules
} aalt;
將原本的 substitute
(sub
) 指令改用 reversesub
或 rsub
,其他的觀念都和 LookupType 6 相通。
對排版渲染引擎來說,會從一個詞的最後方開始往前比對。通常用於處理阿拉伯文的 init、medi、fina、isol 特性——同一個字在一個詞的不同位置,會有不同的樣子,置於詞首、詞中、詞尾、或是單獨存在時都長得不一樣,這部分是漢字文化圈的我們比較難以想像的。